/*
 * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package com.sun.corba.se.impl.oa.toa;

import java.util.Map;
import java.util.HashMap;

import org.omg.CORBA.INTERNAL;
import org.omg.CORBA.CompletionStatus;

import com.sun.corba.se.spi.oa.ObjectAdapterFactory;
import com.sun.corba.se.spi.oa.ObjectAdapter;

import com.sun.corba.se.spi.orb.ORB;

import com.sun.corba.se.spi.ior.ObjectAdapterId;

import com.sun.corba.se.impl.oa.toa.TOAImpl;
import com.sun.corba.se.impl.oa.toa.TransientObjectManager;

import com.sun.corba.se.impl.javax.rmi.CORBA.Util;

import com.sun.corba.se.impl.ior.ObjectKeyTemplateBase;

import com.sun.corba.se.spi.logging.CORBALogDomains;
import com.sun.corba.se.impl.logging.ORBUtilSystemException;

public class TOAFactory implements ObjectAdapterFactory {

  private ORB orb;
  private ORBUtilSystemException wrapper;

  private TOAImpl toa;
  private Map codebaseToTOA;
  private TransientObjectManager tom;

  public ObjectAdapter find(ObjectAdapterId oaid) {
    if (oaid.equals(ObjectKeyTemplateBase.JIDL_OAID))
    // Return the dispatch-only TOA, which can dispatch
    // request for objects created by any TOA.
    {
      return getTOA();
    } else {
      throw wrapper.badToaOaid();
    }
  }

  public void init(ORB orb) {
    this.orb = orb;
    wrapper = ORBUtilSystemException.get(orb,
        CORBALogDomains.OA_LIFECYCLE);
    tom = new TransientObjectManager(orb);
    codebaseToTOA = new HashMap();
  }

  public void shutdown(boolean waitForCompletion) {
    if (Util.isInstanceDefined()) {
      Util.getInstance().unregisterTargetsForORB(orb);
    }
  }

  public synchronized TOA getTOA(String codebase) {
    TOA toa = (TOA) (codebaseToTOA.get(codebase));
    if (toa == null) {
      toa = new TOAImpl(orb, tom, codebase);

      codebaseToTOA.put(codebase, toa);
    }

    return toa;
  }

  public synchronized TOA getTOA() {
    if (toa == null)
    // The dispatch-only TOA is not used for creating
    // objrefs, so its codebase can be null (and must
    // be, since we do not have a servant at this point)
    {
      toa = new TOAImpl(orb, tom, null);
    }

    return toa;
  }

  public ORB getORB() {
    return orb;
  }
};
